package com.ipartek.formacion.gestformwww.modelo.beans;

import com.ipartek.formacion.gestformwww.controlador.Verificador;
import java.text.SimpleDateFormat;
import java.util.ResourceBundle;
import java.util.Calendar;

/**
 *
 *
 * Clase que contienen los parametros para el filtrado.
 *
 * @version 1.0
 * 29/10/2010
 * @author David y Karmele
 *
 */
public class FiltroCurso {
    ResourceBundle bundle;
    Integer estado;
    String nombre;
    Integer tipo;
    String cliente;
    String fechainiciocom;
    String fechainiciofin;
    String fechafincom;
    String fechafinfin;
    String lugar;
    Integer duracion;
    String columnafiltrar;
    String orden;
    Integer pagsiguiente;
    Integer elementospag;

    /**
     * Construcctor por defecto
     */
    public FiltroCurso() {
    }

    public FiltroCurso(ResourceBundle bundle) {
        this.pagsiguiente = 1;
        this.estado = 1;
        this.tipo = 0;
        this.duracion = 0;
        this.elementospag = Integer.parseInt(bundle.getString("numRegPagCursos"));

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Calendar fecha = Calendar.getInstance();
        this.fechafincom = (sdf.format(fecha.getTime()).trim());
        int mesBusqueda = Integer.parseInt(bundle.getString("mesBusqueda"));
        fecha.add(Calendar.MONTH, mesBusqueda);
        this.fechafinfin = sdf.format(fecha.getTime()).trim();
        this.bundle = bundle;
    }

    /**
     * Constructor con todos los parámetros
     * @param bundle Resurso.
     * @param estado Indica el estado del curso 1='Todos',2='aplazados',3='No aplazados'.
     * @param nombre Buscará los cursos que contengan el valor de este parametro en su nombre.
     * @param tipo Buscará los cursos que contengan el valor de este parametro en su tipo.
     * @param cliente Buscará los cursos que contengan el valor de este parametro en el nombre del cliente del curso.
     * @param fechainicio Buscará los cursos que contengan el valor de este parametro en su fecha de inicio.
     * @param fechafin Buscará los cursos que contengan el valor de este parametro en su fecha de fin.
     * @param lugar Buscará los cursos que contengan el valor de este parametro en el lugar donde se imparten.
     * @param duracion Buscará los cursos que contengan el valor de este parametro en su duración.
     * @param columnafiltrar Indica la columna por la que se ordenará, debe estar mapeado en el Recurso.
     * @param orden Indica el orden que se aplicara. 'ASC'= Ascendente (por defecto), 'DESC'=descendente.
     * @param pagsiguiente Indica el número del la página siguiente.
     * @param elementospag Indica el nuemro de elementos que se mostraran por página.
     */
    public FiltroCurso(ResourceBundle bundle, int estado, String nombre, int tipo, String cliente, String fechainiciocom, String fechainiciofin, String fechafincom, String fechafinfin, String lugar, int duracion, String columnafiltrar, String orden, int pagsiguiente, int elementospag) {
        this.bundle = bundle;
        this.estado = estado;
        this.nombre = nombre;
        this.tipo = tipo;
        this.cliente = cliente;
        this.fechainiciocom = fechainiciocom;
        this.fechainiciofin = fechainiciofin;
        this.fechafincom = fechafincom;
        this.fechafinfin = fechafinfin;
        this.lugar = lugar;
        this.duracion = duracion;
        this.columnafiltrar = columnafiltrar;
        this.orden = orden;
        this.pagsiguiente = pagsiguiente;
        this.elementospag = elementospag;
    }

    public ResourceBundle getBundle() {
        return bundle;
    }

    public String getCliente() {
        return cliente;
    }

    public String getColumnafiltrar() {
        return columnafiltrar;
    }

    public int getDuracion() {
        return duracion;
    }

    public int getElementospag() {
        return elementospag;
    }

    public int getEstado() {
        return estado;
    }

    public String getFechafincom() {
        return fechafincom;
    }

    public String getFechafinfin() {
        return fechafinfin;
    }

    public String getFechainiciocom() {
        return fechainiciocom;
    }

    public String getFechainiciofin() {
        return fechainiciofin;
    }

    public String getLugar() {
        return lugar;
    }

    public String getNombre() {
        return nombre;
    }

    public String getOrden() {
        return orden;
    }

    public int getPagsiguiente() {
        return pagsiguiente;
    }

    public int getTipo() {
        return tipo;
    }

    public void setBundle(ResourceBundle bundle) {
        this.bundle = bundle;
    }

    public void setCliente(String cliente) {
        if (Verificador.caracteresCorrectos(cliente)) {
            if (cliente != null) {
                this.cliente = cliente;
            }
        } else {
            this.cliente = null;
        }
    }

    public void setColumnafiltrar(String columnafiltrar) {
        if (Verificador.caracteresCorrectos(columnafiltrar)) {
            if (columnafiltrar != null) {
                this.columnafiltrar = columnafiltrar;
            }
        } else {
            this.columnafiltrar = null;
        }
    }

    public void setDuracion(int duracion) {
        this.duracion = duracion;
    }

    public void setDuracion(String duracion) {
        if (Verificador.numeroValido(duracion)) {
            this.duracion = Integer.parseInt(duracion);
        } else {
            if (duracion != null) {
                this.duracion = 0;
            }
        }
    }

    public void setElementospag(int elementospag) {
        this.elementospag = elementospag;
    }

    public void setElementospag(String elementospag) {
        if (Verificador.numeroValido(elementospag)) {
            this.elementospag = Integer.parseInt(elementospag);
        }
    }

    public void setEstado(int estado) {
        this.estado = estado;
    }

    public void setEstado(String estado) {
        if (Verificador.numeroValido(estado)) {
            this.estado = Integer.parseInt(estado);
        } else {
            if (estado != null) {
                this.estado = 1;
            }
        }
    }

    public void setFechafincom(String fechafincom) {
        if (!Verificador.fechaValida(fechafincom)) {
            this.fechafincom = "";
        } else {
            if (fechafincom != null) {
                this.fechafincom = fechafincom;
            }
        }

    }

    public void setFechafinfin(String fechafinfin) {
        if (!Verificador.fechaValida(fechafinfin)) {
            this.fechafincom = "";
        } else {
            if (fechafinfin != null) {
                this.fechafinfin = fechafinfin;
            }
        }
    }

    public void setFechainiciocom(String fechainiciocom) {
        if (Verificador.fechaValida(fechainiciocom)) {
            if (fechainiciocom != null) {
                this.fechainiciocom = fechainiciocom;
            }
        } else {
            this.fechainiciocom = null;
        }
    }

    public void setFechainiciofin(String fechainiciofin) {
        if (Verificador.fechaValida(fechainiciofin)) {
            if (fechainiciofin != null) {
                this.fechainiciofin = fechainiciofin;
            }
        } else {
            this.fechainiciofin = null;
        }
    }

    public void setLugar(String lugar) {
        if (Verificador.caracteresCorrectos(lugar)) {
            if (lugar != null) {
                this.lugar = lugar;
            }
        } else {
            this.lugar = null;
        }
    }

    public void setNombre(String nombre) {
        if (Verificador.caracteresCorrectos(nombre)) {
            if (nombre != null) {
                this.nombre = nombre;
            }
        } else {
            this.nombre = null;
        }
    }

    public void setOrden(String orden) {
        if (Verificador.caracteresCorrectos(orden)) {
            if (orden != null) {
                this.orden = orden;
            }
        } else {
            this.orden = null;
        }
    }

    public void setPagsiguiente(int pagsiguiente) {
        this.pagsiguiente = pagsiguiente;
    }

    public void setPagsiguiente(String pagsiguiente) {
        if (Verificador.numeroValido(pagsiguiente)) {
            this.pagsiguiente = Integer.parseInt(pagsiguiente);
        } else {
            this.pagsiguiente = 1;
        }
    }

    public void setTipo(int tipo) {
        this.tipo = tipo;
    }

    public void setTipo(String tipo) {
        if (Verificador.numeroValido(tipo)) {
            this.tipo = Integer.parseInt(tipo);
        } else {
            if (tipo != null) {
                this.tipo = 0;
            }
        }
    }

    /**
     * Método que genera una consulta en SQL aplicando los parámetros de filtrado.
     * @return SQL de consulta aplicando los parametros de filtrado.
     */
    public String getSQL() {
        String sql = "";
        String filtro = "ORDER BY curso.CurId";
        String and = "";
        String where = " WHERE ";
        if (columnafiltrar != null && !columnafiltrar.trim().equals("")) {
            String columna = bundle.getString(columnafiltrar);
            if (columna != null && !columna.trim().equals("")) {
                filtro = "ORDER BY " + columna;
                if (orden != null && !orden.trim().equals("")) {
                    if (orden.trim().equals("ASC") || orden.trim().equals("DESC")) {
                        filtro = filtro + " " + orden;
                    }
                }
            }
        }
       // sql = "SELECT CurId, CurNom, CurFchaInReal, CurFchaFinReal, CurHoraInicio, CurHoraFin, CurObservacion, CurLugarImpart, CurDuracion, CurDuracionMinutos, CurProyector, curso.CliId, CurFchaInPrev, CurFchaFinPrev, CurCodINEM, CurNuAccion, CurNuGrupo, CurRutaDoc, curso.TipCurId, EnviarCorreo, CurAplazado, CurFaltasMes, CurTotalFaltas, CurPlazoReserva, cliente.CliNom, tipocurso.TipCurDescr, ROW_NUMBER() OVER (" + filtro + ") AS RowNum FROM curso LEFT JOIN cliente ON curso.CliId=cliente.CliId LEFT JOIN tipocurso ON curso.TipCurId=tipocurso.TipCurId";
        sql = "SELECT CurId, CurNom, CurFchaInReal, CurFchaFinReal, CurHoraInicio, CurHoraFin, CurObservacion, CurLugarImpart, CurDuracion, CurDuracionMinutos, CurProyector, curso.CliId, CurFchaInPrev, CurFchaFinPrev, CurCodINEM, CurNuAccion, CurNuGrupo, CurRutaDoc, curso.TipCurId, EnviarCorreo, CurAplazado, CurFaltasMes, CurTotalFaltas, CurPlazoReserva, cliente.CliNom, tipocurso.TipCurDescr FROM curso LEFT JOIN cliente ON curso.CliId=cliente.CliId LEFT JOIN tipocurso ON curso.TipCurId=tipocurso.TipCurId";
        if (estado == 2) { //buscar cursos aplazados
            sql = sql + where + "curso.CurAplazado=1";
            where = "";
            and = " AND ";
        } else if (estado == 3) { //buscar cursos no aplazados
            sql = sql + where + "curso.CurAplazado=0";
            and = " AND ";
            where = "";
        }
        if (nombre != null && !nombre.trim().equals("")) {
            sql = sql + where + and + "curso.CurNom LIKE '%" + nombre + "%'";
            and = " AND ";
            where = "";
        }
        if (tipo != 0) {
            sql = sql + where + and + "curso.TipCurId=" + tipo;
            and = " AND ";
            where = "";
        }
        if (cliente != null && !cliente.trim().equals("")) {
            sql = sql + where + and + "cliente.CliNom LIKE '%" + cliente + "%'";
            and = " AND ";
            where = "";
        }
        if (fechainiciocom != null && !fechainiciocom.trim().equals("") && fechainiciofin != null && !fechainiciofin.trim().equals("")
                && fechafincom != null && !fechafincom.trim().equals("") && fechafinfin != null && !fechafinfin.trim().equals("")) {
            sql = sql + where + and + "curso.CurFchaInReal>='" + fechainiciocom + "' AND curso.CurFchaInReal<='" + fechainiciofin + "' AND curso.CurFchaFinReal>='" + fechafincom + "' AND curso.CurFchaFinReal<='" + fechafinfin + "'";
            and = " AND ";
            where = "";
        } else if ((fechainiciocom != null && !fechainiciocom.trim().equals("")) && (fechainiciofin != null && !fechainiciofin.trim().equals(""))) {
            sql = sql + where + and + "curso.CurFchaInReal>='" + fechainiciocom + "' AND curso.CurFchaInReal<='" + fechainiciofin + "'";
            and = " AND ";
            where = "";
        //Adrian y Guille
        //Si fechafinfin = null y fechafincom!=null
        //Sacara todos los registros de los cursos 'Activos'
        //Cuya fechaFin sea mayor a la fecha actual.
        }else if((fechafincom)!=null && !fechafincom.trim().equals("")){
            sql = sql + where + and + "curso.CurFchaFinReal>='" + fechafincom + "'";
            and = " AND ";
            where = "";
        } else if ((fechafincom != null && !fechafincom.trim().equals("")) && (fechafinfin != null && !fechafinfin.trim().equals(""))) {
            sql = sql + where + and + "curso.CurFchaFinReal>='" + fechafincom + "' AND curso.CurFchaFinReal<='" + fechafinfin + "'";
            and = " AND ";
            where = "";
        }
        if (lugar != null && !lugar.trim().equals("")) {
            sql = sql + where + and + "curso.CurLugarImpart LIKE '%" + lugar + "%'";
            and = " AND ";
            where = "";
        }
        if (duracion != 0) {
            sql = sql + where + and + "curso.CurDuracion=" + duracion;
            and = " AND ";
            where = "";
        }
        sql= sql+ " " + filtro;
        return sql;
    }
}
